/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.ufpr.inf.escel.brain.model.po;

import br.ufpr.inf.escel.brain.util.PrimitivosUtils;
import java.util.ArrayList;

/**
 *
 * @author gustavo
 */
public class Parametros {

    private String[] parametros;

    public Parametros(String[] parametros) {
        this.parametros = new String[parametros.length];

        for (int i = 0; i < parametros.length; i++) {
            this.parametros[i] = parametros[i].trim();
        }
    }

    public Parametros() {
    }

    public static Parametros getInstance() {
        return new Parametros();
    }

    /**
     * Encapsulamento da variavel quantidade
     * @return private quantidade
     * @since 3.4
     */
    public int quantidade() {
        return (this.parametros != null) ? parametros.length : 0;
    }

    /**
     * Remove o metodo de acordo com o indice.
     * @param indiceParametro
     * @since 3.4
     */
    public void removerParametro(int indiceParametro) {
        //converte pra list
        ArrayList list = PrimitivosUtils.arrayToList(parametros);
        //remove
        try {
            list.remove(indiceParametro);
        } catch (Exception e) {
            System.out.println(list + ", " + indiceParametro);
            e.printStackTrace();
        }

        //volta pra array
        String[] novosParametros = PrimitivosUtils.listToArray(list);
        //altera a referencia
        this.parametros = novosParametros;
    }

    /**
     * Retorna uma instancia do parametro de acordo
     * com o indice passado como referencia
     *
     * @param indice i
     * @return Parametro
     * @since 3.4
     */
    public Parametro getParametro(int i) {
        return new Parametro(parametros[i], i);
    }

    /**
     * Adiciona vários parametros de uma única vez
     * @param vetor de parametros que devem ser adicionados
     * @since 3.4
     */
    public void adicionarParametros(String[] parametros) {

        String[] novosParametros;

        if (this.parametros != null) {
            novosParametros = new String[this.parametros.length + parametros.length];

            //completa com os metodos antigos
            for (int i = 0; i < this.parametros.length; i++) {
                novosParametros[i] = this.parametros[i];
            }

            //completa com os metodos novos
            for (int i = 0; i < parametros.length; i++) {
                novosParametros[quantidade() + i] = parametros[i];
            }
        } else {
            novosParametros = new String[parametros.length];

            //completa novamente
            for (int i = 0; i < parametros.length; i++) {
                novosParametros[i] = parametros[i];
            }
        }

        //muda a referencia
        this.parametros = novosParametros;

    }

    /**
     * Adiciona vários parametros de uma única vez
     * @param objeto parametros
     * @since 4.1
     */
    public void adicionarParametros(Parametros param) {
        String novosParametros[] = PrimitivosUtils.copyArray(this.parametros, param.quantidade());

        for (int i = 0; i < param.quantidade(); i++) {
            int indexParametro = (parametros != null) ? this.parametros.length : 0;
            novosParametros[indexParametro + i] = param.getParametro(i).toString();
        }

        //muda a referencia
        this.parametros = novosParametros;
    }

    /**
     * Adiciona um objeto parametro dentro do objetos parametros
     * @param objeto parametro
     * @since 4.1
     */
    public void adicionarParametros(Parametro parametro) {
        String novosParametros[] = PrimitivosUtils.copyArray(this.parametros, 1);
        novosParametros[novosParametros.length - 1] = parametro.toString();
        //muda a referencia
        this.parametros = novosParametros;
    }

    /**
     * Modifica o parametro no vetor, de acordo
     * com o novo parametro informado
     * @param objeto parametro
     */
    public void setParametro(Parametro p) {
        this.parametros[p.getIndiceParametro()] = p.toString();
    }

    /**
     * Sorteia um parametro do vetor e cria uma instancia
     *
     * @return new Parametro() sorteado
     * @since 3.4
     */
    public Parametro sortearParametro() {
        int indiceParametro = (int) (Math.random() * quantidade());
        return new Parametro(parametros[indiceParametro], indiceParametro);
    }

    /**
     * Verifica se existe algum parametro
     * @return (quantidade > 1) ? true : false;
     * @since 3.4
     */
    public boolean hasParameter() {
        return (quantidade() > 0) ? true : false;
    }

    /**
     * Formatação dos parametros em string
     * @return vetor de parametros como string
     * @since 3.4
     */
    @Override
    public String toString() {
        return (null != parametros) ? PrimitivosUtils.arrayToString(parametros, ", ") : "";
    }
}
